﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using SIS_Wcf_Server.Model;

namespace SIS_Wcf_Server.Search
{
    public class DefaultSearch : ISearch
    {
        private readonly IData _data;


        public DefaultSearch(Model.IData data)
        {
            _data = data;
        }

        public List<RestInformation> DoListAll()
        {

            var restinfoList = new List<RestInformation>();

            //map data fra information til restinformation
            foreach (var info in _data.GetInformationForLocations( _data.GetAllLocations( ) ))
            {
                var restInfo = new RestInformation();
                restInfo.Information = info;

                //map informations data til rest klassen.
                restInfo.InformationsData = new List<RestInformationsData>();
                foreach (var idata in info.InformationsData)
                    restInfo.InformationsData.Add(new RestInformationsData() { InformationsData = idata, Tags = idata.Tags.ToList() });

                //Map gps og net lokationer over i en search lokations struktur.
                var searchLokationer = new List<Model.Lokation>();
                foreach (var gps in info.gpsPositioner)
                {
                    searchLokationer.Add(new Model.Lokation() { Type = "GPS", Value = gps.Lat + "/" + gps.Long });
                }

                foreach (var net in info.net)
                {
                    searchLokationer.Add(new Model.Lokation() { Type = net.Type, Value = net.Value });
                }

                restInfo.Lokationer = searchLokationer;


                restinfoList.Add(restInfo);
            }


            return restinfoList;
        }

        public List<RestInformation> DoSearch(List<Model.Lokation> locations)
        {

            //Inden vi søger gemmer vi alle informationerne. Så får vi måske også udbygget vores relationer på den nuværende søgning.
            _data.SaveAndRelateLocations(locations);


            //Søg efter informationer der matcher vores lokationer.

            var information =  _data.GetInformationForLocations(locations);


            var restinfoList = new List<RestInformation>();

            //map data fra information til restinformation
            foreach (var info in information)
            {
                var restInfo = new RestInformation();                
                restInfo.Information = info;
                
                //map informations data til rest klassen.
                restInfo.InformationsData = new List<RestInformationsData>();
                foreach (var idata in info.InformationsData)                
                    restInfo.InformationsData.Add(new RestInformationsData() {InformationsData = idata, Tags = idata.Tags.ToList()});                    
                              
                //Map gps og net lokationer over i en search lokations struktur.
                var searchLokationer = new List<Model.Lokation>();
                foreach (var gps in info.gpsPositioner)
                {
                    searchLokationer.Add(new Model.Lokation() {Type = "GPS",Value = gps.Lat + "/" + gps.Long });
                }

                foreach (var net in info.net)
                {
                    searchLokationer.Add(new Model.Lokation() { Type = net.Type, Value = net.Value });
                }

                restInfo.Lokationer = searchLokationer;


                restinfoList.Add(restInfo);
            }


            return restinfoList;
        }
    }
}